﻿using Npgsql;
using Real.Datos.Interfaces;
using Real.Entidad;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dapper;
using DapperExtensions;

namespace Real.Datos.Repositories
{
    public interface IProveedorRepository : IRepository<Proveedor>
    {
        IList<Proveedor> FindAllWithIvaActividad();
        Proveedor FindByIdWithIvaActividad(int id);
        IList<Proveedor> FindByProveedor(string proveedor);
    }
    public class ProveedorRepository : IProveedorRepository
    {
        protected readonly IDbConnection _db;

        public ProveedorRepository()
        {
            _db = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["REAL"].ToString()); 
        }

        public IList<Proveedor> FindAll()
        {
            using (IDbConnection _db = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["REAL"].ToString()))
            {
                return _db.Query<Proveedor>("SELECT * FROM PROVEEDOR").ToList();
            }
            
        }

        public IList<Proveedor> Find(System.Linq.Expressions.Expression<Func<Proveedor, bool>> predicate)
        {
            throw new NotImplementedException();
        }

        public Proveedor FindById(int id)
        {
            const string query = "SELECT * FROM PROVEEDOR WHERE proid = @id";

            using (IDbConnection _db = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["REAL"].ToString()))
            {
                return _db.Query<Proveedor>(query, new { id = id }).SingleOrDefault();
            }
        }

        public int Add(Proveedor newEntity)
        {
            throw new NotImplementedException();
        }

        public bool Remove(int id)
        {
            throw new NotImplementedException();
        }

        public int Modify(Proveedor entity)
        {
            throw new NotImplementedException();
        }

        public IList<Proveedor> FindAllWithIvaActividad()
        {
            string query = "SELECT * FROM PROVEEDOR " +
                            "INNER JOIN TIPOIVA ON TIPOIVA.TPIID = PROVEEDOR.TPIID " +
                            "INNER JOIN ACTIVIDAD ON ACTIVIDAD.ACTID = PROVEEDOR.ACTID";

            using (IDbConnection _db = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["REAL"].ToString()))
            {
                return _db.Query<Proveedor, CondicionIva, Actividad, Proveedor>(query, (proveedor, condiva, actividad) => 
                { proveedor.condicioniva = condiva; proveedor.actividad = actividad; return proveedor; }, splitOn:"tpiid, actid").ToList();
            }
        }


        public Proveedor FindByIdWithIvaActividad(int id)
        {
            string query = "SELECT * FROM PROVEEDOR " +
                          "INNER JOIN TIPOIVA ON TIPOIVA.TPIID = PROVEEDOR.TPIID " +
                          "INNER JOIN ACTIVIDAD ON ACTIVIDAD.ACTID = PROVEEDOR.ACTID " +
                          "WHERE PROVEEDOR.PROID = @ID";

            using (IDbConnection _db = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["REAL"].ToString()))
            {
                return _db.Query<Proveedor, CondicionIva, Actividad, Proveedor>(query, (proveedor, condiva, actividad) =>
                { proveedor.condicioniva = condiva; proveedor.actividad = actividad; return proveedor; }, new { ID = id }, splitOn: "tpiid, actid").SingleOrDefault();
            }
        }


        public IList<Proveedor> FindByProveedor(string proveedor)
        {
            string query = "SELECT * FROM PROVEEDOR " +
                            "WHERE PRONOMBRE LIKE '%" + proveedor + "%'";

            using (IDbConnection _db = new NpgsqlConnection(ConfigurationManager.ConnectionStrings["REAL"].ToString()))
            {
                return _db.Query<Proveedor>(query).ToList();
            }
        }
    }
}
